package com.tree.thrive.business.input.service;

import com.alibaba.fastjson.JSON;
import com.tree.thrive.business.el.Lock;
import com.tree.thrive.business.input.domain.dto.InputCheckResultDTO;
import com.tree.thrive.business.input.domain.req.InputCheckReq;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

/**
 * learning
 *
 * @Auther: cheng.tang
 * @Date: 2022/4/27 6:10 AM
 * @Description:
 */
@Service
@Slf4j
public class InputCheckServiceImpl implements InputCheckService {


    @Value("${length.limit:10}")
    private int lengthLimit;

    /**
     * 错误信息 org.springframework.expression.spel.SpelParseException: Expression [#{req.name}] @1: EL1043E: 意外的标记。期望 'identifier'，但是遇到了 'lcurly({)' 表示 SpEL（Spring Expression Language）表达式 #{req.name} 存在语法错误。
     * <p>
     * 根据错误信息，表达式中使用了花括号 ({})。在 SpEL 中，花括号用于定义集合或映射，而不是直接访问属性或变量。
     * <p>
     * 要解决这个问题，你应该移除花括号，并使用点操作符 (.) 来访问 req 对象的 name 属性。修正后的表达式为 req.name。
     *
     * @param req
     * @return
     */
    @Lock(path = "#req.name")
    @Override
    public InputCheckResultDTO handle(InputCheckReq req) {
        req.subStringNote(lengthLimit);
        log.info("result {} ", JSON.toJSONString(req));
        InputCheckResultDTO resultDTO = new InputCheckResultDTO();
        BeanUtils.copyProperties(req, resultDTO);
        return resultDTO;
    }

}
